﻿using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Generic;
using innovations.ml.core.solvers;
using System.Collections.Generic;

namespace innovations.ml.core.models
{
    public interface IModel
    {
        void ComputeCost(bool includeGradient = false);
        //void ComputeGradient();
        void ComputeCostAndGradient(double[] theta, ref double j, double[] gradient, object obj);
        void SetLogicalY(int label);
        Matrix<double> X { get; set; }
        Vector<double> Y { get; set; }
        Vector<double> LogicalY { get; set; }
        Vector<double> Theta { get; set; }
        Matrix<double> MultiClassTheta { get; set; }
        List<Matrix<double>> MultiLevelMultiClassTheta { get; set; }
        Vector<double> Gradient { get; set; }
        Vector<double> Mu { get; set; }
        Vector<double> Sigma { get; set; }
        double J { get; set; }
        Vector<double> J_History { get; set; }
        Vector<double> Predictions { get; set; }
        double Lambda { get; set; }
        Solver Solver { get; set; }
    }
}
